package Contracts;

import Exceptions.PostCondException;
import Impl.Type;
import Services.BlocService;

public class BlocServiceContract extends BlocServiceDecorator{

	public BlocServiceContract(BlocService blocService) {
		super(blocService);
	}
	
	public void checkInvariants(){
	}
	
	// CONSTRUCTEURS
	public void init(Type type){
		super.init(type);
		
		checkInvariants();
		
		if(! (getDelegate().getType()==type))
			throw new PostCondException("post 1 dans init");
		
		if(! (getDelegate().getOldType()==Type.Vide))
			throw new PostCondException("post 2 dans init");
	}
	
	public void clone(BlocService bloc){
		super.clone(bloc);
		
		checkInvariants();
		
		if(! (getDelegate().getType()==bloc.getType()))
			throw new PostCondException("post 1 dans clone");
		
		if(! (getDelegate().getOldType()==bloc.getOldType()))
			throw new PostCondException("post 2 dans clone");
	}
	
	// OBSERVATEURS
	public Type getType(){
		return super.getType();
	}
	public Type getOldType(){
		return super.getOldType();
	}
	
	// OPERATEURS
	// post: getType()==type
	// post: getOldType()==getType()@pre
	public void ChangeType(Type type){
		checkInvariants();
		
		Type typeAtPre = getType();
		
		super.ChangeType(type);
		
		checkInvariants();
		
		if(! (getDelegate().getType()==type))
			throw new PostCondException("post 1 dans ChangeType");
		
		if(! (getDelegate().getOldType()==typeAtPre))
			throw new PostCondException("post 1 dans ChangeType");
	}

}
